//package com.ccp.dev.qbdms.controller;
//
//import com.ccp.dev.core.basic.annotion.Action;
//import com.ccp.dev.core.basic.internationalization.SysBaseController;
//import com.ccp.dev.core.basic.response.ResultData;
//import com.google.common.collect.Maps;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import org.apache.commons.compress.utils.Lists;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.stereotype.Controller;
//import org.springframework.ui.Model;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.ResponseBody;
//
///**
// * @author :milihao
// * @date :2020-06-09
// */
//@Controller
//@RequestMapping("/dataSynchronization")
//public class DataSynchronizationController extends SysBaseController {
//
//	private static final Logger LOGGER = LoggerFactory.getLogger(DataSynchronizationController.class);
//
//	/**
//	 * 源数据库
//	 */
//	@Autowired
//	@Qualifier("sourceJdbcTemplate")
//	protected JdbcTemplate sourceJdbcTemplate;
//
//	/**
//	 * 需要备份数据库
//	 */
//	@Autowired
//	@Qualifier("synchronizationJdbcTemplate")
//	protected JdbcTemplate synchronizationJdbcTemplate;
//	/**
//	 * 生产数据库名
//	 */
//	@Value("${spring.datasource.source.name}")
//	public String sourceDatabaseName;
//
//	/**
//	 * 测试数据库名
//	 */
//	@Value("${spring.datasource.synchronization.name}")
//	public String synchronousDatabaseName;
//
//
//	/**
//	 * 生产数据库名
//	 */
//	@Value("${spring.datasource.source.userName}")
//	public String sourceDatabaseUserName;
//
//	/**
//	 * 测试数据库名
//	 */
//	@Value("${spring.datasource.synchronization.userName}")
//	public String synchronousDatabaseUserName;
//
//
//	@RequestMapping("/index")
//	@Action(description = "跳转同步数据列表页面")
//	public String index(Model model) {
//		ArrayList<String> tableList = screenData("SELECT TABLE_NAME FROM USER_TAB_COMMENTS");
//		model.addAttribute("tableList", tableList);
//		return "dataSynchronization/index";
//	}
//
//	/**
//	 * 同步所有数据
//	 *
//	 * @author :milihao
//	 * @date :2020/06/08
//	 */
//	@GetMapping(value = "/doSyncData")
//	@ResponseBody
//	@Action(description = "同步所有数据")
//	public ResultData doSyncData() {
//		long startTime = System.currentTimeMillis();
//		String sql = "SELECT TABLE_NAME FROM USER_TAB_COMMENTS";
//		ArrayList<String> tableList = screenData(sql);
//		List<String> endTableList = Lists.newArrayList();
//		while (tableList.size() > 0) {
//			for (int i = tableList.size() - 1; i >= 0; i--) {
//				try {
//					String tableName = tableList.get(i);
//					dropTable(tableName);
//					tableList.remove(tableName);
//					endTableList.add(tableName);
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//		}
//		while (endTableList.size() > 0) {
//			for (int i = endTableList.size() - 1; i >= 0; i--) {
//				String tableName = endTableList.get(i);
//				LOGGER.info("开始新建表:----" + tableName);
//				try {
//					createTable(tableName);
//				} catch (Exception e) {
//					dropTable(tableName);
//					LOGGER.error("重建表:--{}失败", tableName);
//					continue;
//				}
//				//3、插入数据
//				LOGGER.info("开始更新，往表:---{}中插入数据", tableName);
//				int dataCount = insertDataToTable(tableName);
//				LOGGER.info("同步成功，往表:---{}插入了{}条数据", tableName, dataCount);
//				endTableList.remove(tableName);
//			}
//		}
//		long endTime = System.currentTimeMillis();
//		LOGGER.info("cost time :=======" + (endTime - startTime));
//		return new ResultData(0, "同步成功！", 0L, "");
//	}
//
//
//	/**
//	 * 根据表名称同步
//	 *
//	 * @param tableName 表名称
//	 * @author :milihao
//	 * @date :2020/06/08
//	 */
//	@PostMapping(value = "/doSyncDataByName")
//	@ResponseBody
//	@Action(description = "根据表名称同步")
//	public ResultData doSyncDataByName(@RequestParam("tableName") String tableName) {
//		try {
//			dropTable(tableName);
//		} catch (Throwable t) {
//			return new ResultData(-1, "该表存在主外键关系,无法单独删除！", 0L, "");
//		}
//		try {
//			createTable(tableName);
//			insertDataToTable(tableName);
//		} catch (Throwable t) {
//			return new ResultData(-1, "同步失败！", 0L, "");
//		}
//		return new ResultData(0, "同步成功！", 0L, "");
//	}
//
//	/**
//	 * 筛选数据
//	 *
//	 * @return :ArrayList<String>
//	 * @author :milihao
//	 * @date :2020/06/08
//	 */
//	private ArrayList<String> screenData(String sql) {
//		List<Map<String, Object>> maps = sourceJdbcTemplate.queryForList(sql);
//		ArrayList<String> tableList = new ArrayList<>();
//		for (Map<String, Object> map : maps) {
//			for (Object value : map.values()) {
//				tableList.add(value.toString());
//			}
//		}
//		return tableList;
//	}
//
//	/**
//	 * 创建表
//	 *
//	 * @author : milihao
//	 * @date :2020/06/08
//	 */
//	private void dropTable(String tableName) {
//		String checkTableSql =
//				"SELECT COUNT(*) AS C FROM USER_TABLES WHERE TABLE_NAME = '" + tableName.toUpperCase()
//						+ "'";
//		List<Map<String, Object>> listMap = synchronizationJdbcTemplate.queryForList(checkTableSql);
//		String dropTableSql = "DROP TABLE " + synchronousDatabaseUserName + "." + tableName;
//		String c = listMap.get(0).get("C").toString();
//		if (Integer.parseInt(c) != 0) {
//			synchronizationJdbcTemplate.execute(dropTableSql);
//		}
//	}
//
//	/**
//	 * 创建表
//	 *
//	 * @author : milihao
//	 * @date :2020/06/08
//	 */
//	private void createTable(String tableName) {
//		String getDDLSql =
//				"SELECT DBMS_METADATA.GET_DDL('TABLE','" + tableName + "','" + sourceDatabaseName
//						+ "') AS  DDL FROM DUAL";
//
//		List<Map<String, Object>> maps = sourceJdbcTemplate.queryForList(getDDLSql);
//		String ddl = maps.get(0).get("DDL").toString();
//		String createTableSql = ddl
//				.replaceAll("TABLESPACE " + "\"" + sourceDatabaseName + "\"",
//						"TABLESPACE " + "\"" + synchronousDatabaseName + "\"")
//				.replaceAll("\"" + sourceDatabaseUserName + "\"" + "\\.",
//						"\"" + synchronousDatabaseUserName + "\"" + "\\.")
//				.replaceAll("ZHILIANGBASE2", synchronousDatabaseName);
//		synchronizationJdbcTemplate.execute(createTableSql);
//		createTableComment(tableName);
//		createColumnComment(tableName);
//		LOGGER.info("新建表:{}成功", tableName);
//	}
//
//	/**
//	 * 添加表注释
//	 *
//	 * @param tableName 表名称
//	 */
//	public void createTableComment(String tableName) {
//		List<Map<String, Object>> mapTabCommentList = sourceJdbcTemplate
//				.queryForList(
//						"select * from user_tab_comments where TABLE_NAME = " + "\'" + tableName + "\'");
//		for (Map map : mapTabCommentList) {
//			String comment = "";
//			if (null != map.get("COMMENTS")) {
//				comment = map.get("COMMENTS").toString();
//			}
//			synchronizationJdbcTemplate
//					.execute("comment on table " + map.get("TABLE_NAME") + " is " + "\'" + comment + "\'");
//		}
//	}
//
//	/**
//	 * 添加表字段注释
//	 *
//	 * @param tableName 表名称
//	 */
//	public void createColumnComment(String tableName) {
//		List<Map<String, Object>> columnCommentList = sourceJdbcTemplate
//				.queryForList(
//						"select * from user_col_comments where TABLE_NAME = " + "\'" + tableName + "\'");
//		for (Map map : columnCommentList) {
//			String comment = "";
//			if (null != map.get("COMMENTS")) {
//				comment = map.get("COMMENTS").toString();
//			}
//			synchronizationJdbcTemplate
//					.execute(
//							"comment on column " + map.get("TABLE_NAME") + "." + map.get("COLUMN_NAME") + " is "
//									+ "\'" + comment + "\'");
//		}
//	}
//
//	/**
//	 * 将数据插入到表中
//	 *
//	 * @return :int
//	 * @author : milihao
//	 * @date :2020/06/08
//	 */
//	private int insertDataToTable(String tableName) {
//		String getDataListSql = "SELECT * FROM " + tableName;
//		List<Map<String, Object>> list = sourceJdbcTemplate.queryForList(getDataListSql);
//		List<Map<String, Object>> filedCountList = getFiledCountList(tableName);
//		int size = filedCountList.size();
//		String temp = "";
//		for (int i = 0; i < size; i++) {
//			temp += "?,";
//		}
//		temp = temp.substring(0, temp.lastIndexOf(","));
//		String insertSql = "INSERT INTO " + tableName + " VALUES(" + temp + ")";
//		int count = 0;
//		List<Map<String, Object>> errorMapList = Lists.newArrayList();
//		for (Map<String, Object> map : list) {
//			ArrayList<Object> tempList = new ArrayList<>();
//			for (Object value : map.values()) {
//				tempList.add(value);
//			}
//			Object[] obj = tempList.toArray();
//			try {
//				synchronizationJdbcTemplate.update(insertSql, obj);
//			} catch (Exception e) {
//				Map<String, Object> map1 = Maps.newHashMap();
//				map1.put("insertSql", insertSql);
//				map1.put("tempList", tempList);
//				errorMapList.add(map1);
//				continue;
//			}
//			count++;
//		}
//		while (errorMapList.size() > 0) {
//			for (int i = errorMapList.size() - 1; i >= 0; i--) {
//				Map<String, Object> map2 = errorMapList.get(i);
//				try {
//					List<Object> value = (List<Object>) map2.get("tempList");
//					synchronizationJdbcTemplate.update((String) map2.get("insertSql"), value.toArray());
//				} catch (Exception e) {
//					LOGGER.error(e.getMessage());
//					continue;
//				}
//				errorMapList.remove(map2);
//			}
//		}
//		count++;
//		return count;
//	}
//
//	public List<Map<String, Object>> getFiledCountList(String tableName) {
//		//查询表字段数量
//		String filedCountSql =
//				"SELECT A.COLUMN_NAME FROM USER_TAB_COLUMNS A WHERE TABLE_NAME ='" + tableName
//						.toUpperCase()
//						+ "'";
//		List<Map<String, Object>> filedCountList = sourceJdbcTemplate.queryForList(filedCountSql);
//		return filedCountList;
//	}
//}
